System F
単純型付きラムダ計算の拡張
型についての全称量化を導入
Jean-Yves GirardとJohn C. Reynoldsが独立に発見
1972年
inpredicativeな型理論
二階述語論理の関数を記述できる
型アノテーションがないと型推論は決定不可能になる
それでは扱いにくいのでもう少し制限を加えて型アノテーションがなくても決定可能な型推論をできるようにした型システムがHindley-Milner 型システム
パラメトリック多相を形式化するもの
定義
code:bnf
項t = x
| λx:A.t
| Λα.t // genricな型
| t t // 関数適用
| tA // 型適用. []をつけずにtAと書くこともある
型A = α
| A1 -> A2
| ∀α.A
文脈Γ = <>
| <Γ,x:A>
補足
αは型変数
xは変数
Λは型レベルのラムダ抽象
型抽象などと呼ぶ
つまりGenricな型のこと
型を引数に取り、型を返す
Λt.tというラムダ抽象を型t1に適用して、t1になる感じ
λは値レベルのラムダ抽象
λx:A.tは、括弧を付けるならλ(x:A).t
引数xがAで型付けされることで定義域が明示されている
「項t」は、「値レベルのラムダ抽象」と、「型レベルのラムダ抽象」の両方を表す
変数には値のみが代入でき、型変数には型のみが代入できる、という前提がある
t[A]は型Aを関数tに代入しているが、これは暗黙的にtはΛで表現される方のラムダ抽象である
この表記はTaPLに倣っている
一般的には角括弧は書かずにtAと書く
つまり小文字か大文字かで、関数適用か型適用かを判断する
例
恒等関数idをSystem Fで書く
id = Λa.λ(x:a).x
このときid: ∀α.α->α
まずなんらかの型を適用することで、その型に対する恒等関数にする
idBool = id Bool = λx:Bool.x
Bool型を適用することで、Bool型用のidにした
関連
多相型付きラムダ計算
二階直観主義論理
項書換えモデルの強正規化
System Fω
高階論理のカット除去定理
参考
TaPL 23章
一番わかり易い
https://en.wikipedia.org/wiki/System_F
http://www.yl.is.s.u-tokyo.ac.jp/~tatsuo/types/types20011101.pdf 5章
龍田『型理論』 6章
/herp-technote/System F
https://www.sciencedirect.com/science/article/pii/S0168007298000475
https://www.fos.kuis.kyoto-u.ac.jp/~igarashi/class/sf07w/resume6.pdf
http://web.yl.is.s.u-tokyo.ac.jp/~kohei/rinkou/types/resume/types23.pdf
https://yigarashi.hatenablog.com/entry/2015/08/10/154353
https://www.math.nagoya-u.ac.jp/~garrigue/papers/danwakai2015.pdf
https://zehnpaard.hatenablog.com/entry/2022/03/06/113018